{
  // 1.函数声明的时候直接定义类型(形参和返回值)
  function fn1(x:number,y:number,...rest:string[]):number{
    return x+y
  }
  fn1(1,2,"4")

  // 2.函数表达式声明类型
  let fn2=(x:number,y:number):number =>{
    return x+y
  }
 fn2(1,2)

// 3.完整的函数类型  这是类式与对象端口定义类型   =前面是定义类型 等号后面是对应的值  函数中可选值写在最后面
let fn3:(x:number,y?:number)=>number=(x,y)=>{
  if(!y){
    return x
  }
  return x+y
}

// 函数的重载:函数名相同,而形参不同的多个函数
function fn4(x:number,y:number):number
function fn4(x:string,y:string):string
function fn4(x:number|string,y:string|number):(number|string){
  if(typeof x==="number"&&typeof y==="number"){
    return x+y
  }else if(typeof x==="string"&&typeof y==="string"){
    return x+y
}

return ''
}
fn4(1,2)

fn4("1","2")

}





